package cn.edu.ctbu.scoremg.service;

import cn.edu.ctbu.scoremg.constant.REnum;
import cn.edu.ctbu.scoremg.dao.AdminRepository;
import cn.edu.ctbu.scoremg.entity.Admin;
import cn.edu.ctbu.scoremg.exception.RException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Optional;

@Service
public class AdminService {

    @Autowired
    private AdminRepository adminRepository;

    public List<Admin> getAll() {
        return adminRepository.findAll();
    }

    public Page<Admin> getAll(Pageable pageable) {
        return adminRepository.findAll(pageable);
    }

    public Page<Admin> getAll(Example<Admin> example, Pageable pageable) {
        return adminRepository.findAll(example, pageable);
    }

    /**
     * 按id进行查询
     * @param id 主键，整数
     * @return
     */
    public Admin findById(Integer id) {
        return adminRepository.findById(id).orElse(null);
    }

    /**
     * 按用户名进行查询
     * @param name 用户名
     * @return
     */
    public List<Admin> findByName(String name) {
        return adminRepository.findByNameLike(name);
    }

    /**
     * 按用户名和密码查询
     * @param name 用户名
     * @param password 密码
     * @return
     */
    public List<Admin> findByNameAndPassword(String name, String password) {
        return adminRepository.findByNameAndPassword(name, password);
    }

    /**
     * 新增管理员
     * @param admin 管理员对象
     * @return
     */
    public Admin add(Admin admin) {
        return adminRepository.save(admin);
    }

    /**
     * 更新管理员信息
     * @param admin 管理员对象
     * @return
     */
    public Admin update(Admin admin) {
        return adminRepository.save(admin);
    }

    /**
     * 删除管理员
     * @param id 管理员ID
     */
    public void delete(Integer id) {
        adminRepository.deleteById(id);
    }

    /**
     * 验证管理员用户名和密码
     * @param name 用户名
     * @param password 密码
     * @return 验证通过的管理员对象
     * @throws Exception
     */
    public Admin validateUsernameAndPassword(String name, String password) throws Exception {
        List<Admin> admins = adminRepository.findByName(name);
        if(admins.size() > 0) {
            Admin admin = admins.get(0);
            if(admin.getPassword().equals(password)) {
                return admin;
            } else {
                throw new RException(REnum.LOGIN_ERR);
            }
        } else {
            throw new RException(REnum.LOGIN_ERR);
        }
    }

    /**
     * 批量删除管理员
     * @param ids 管理员ID列表
     */
    public void deleteBatch(List<Integer> ids) {
        adminRepository.deleteAllById(ids);
    }

    /**
     * 验证管理员编号和密码
     */
    public Admin validateNoAndPassword(String no, String password) throws Exception {
        List<Admin> admins = adminRepository.findByNo(no);
        if(admins.size() > 0) {
            Admin admin = admins.get(0);
            if(admin.getPassword().equals(password)) {
                return admin;
            } else {
                throw new RException(REnum.LOGIN_ERR);
            }
        } else {
            throw new RException(REnum.LOGIN_ERR);
        }
    }
}